/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tsb.UI.PanelArrastrar;

import java.util.logging.Level;
import java.util.logging.Logger;
import tsb.UI.PopupMenus.PopupMenu;
import java.awt.Component;
import java.awt.Point;
import java.util.Iterator;
import java.util.LinkedList;
import tsb.UI.arbol.panelArbolo;
import tsb.dominio.dispositivos.Dispositivo;
import tsb.dominio.excepciones.MACException;
import tsb.gestores.GestorGrafo;

public class BotonPersonalizado extends javax.swing.JButton {
    
    public static final int PC=1;
    public static final int SERVIDOR=2;
    public static final int IMPRESORA=3;
    public static final int ROUTER=4;
    public static final int SWITCH=5;
    public static final int SERVER=6;
    public static final int MODEM=7;
    
    
    
    private int tipoDispositivo;//para saber que tipo de dispositivo se esta agregando
    private int tipoDeConeccion;//para saber que tipo de coneccion se esta realizando
    private Point ubicacion;
    private PanelPrincipalV2 panelPrincipal=null;
    
    private LinkedList<LineaConexion> conexiones = new LinkedList<LineaConexion>();
    
    private boolean ventanaAbierta=false; //para saber si se abrio la ventana False=cerrada True=Abierta
    
    
    
    public BotonPersonalizado(String nombre, int tipo, Point ubicacion)
    {
         this.tipoDispositivo=tipo;
         this.ubicacion=ubicacion;
         
         switch(tipoDispositivo)
         {
             case 1: 
                 this.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tsb/UI/Imagenes/PC_65x65.png")));
                 break;
             case 2: 
                 this.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tsb/UI/Imagenes/ROUTER_65x65.png")));
                  break;
             case 3:
                 break;
             case 4:
                 this.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tsb/UI/Imagenes/ROUTER_65x65.png")));
                 break;
             case 5:
                 this.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tsb/UI/Imagenes/SWITCH_65x65.png")));
                  break;
             case 6:
                  this.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tsb/UI/Imagenes/SERVER_65x65.png")));
                 break;
             case 7:
                  this.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tsb/UI/Imagenes/MODEM_65x65.png")));
                 break;
         }
         
         this.setBorder(null);
         this.setBackground(new java.awt.Color(255, 255, 255));
         this.setText(nombre);
         this.setContentAreaFilled(false);
         this.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
         this.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
         this.setName("botonArrastrable");
         
         this.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
         
         
         
          this.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                try {
                    MousePressed(evt);
                } catch (MACException ex) {
                    Logger.getLogger(BotonPersonalizado.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                MouseReleased(evt);
            }
        });
          
        this.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                MouseDragged(evt);
            }
        });
        
        PopupMenu popup = new PopupMenu(this);

    }
    
   public PanelPrincipalV2 getPanelPrincipal()
   {
       return this.panelPrincipal;
   }

   public int getTipoDisp()
   {
       return tipoDispositivo;
   }
    public void setPanelPrincipal(PanelPrincipalV2 panelPrincipal) {
        this.panelPrincipal = panelPrincipal;
    }
    
    public void addConexion(LineaConexion c)
    {
        this.conexiones.add(c);
    }

    public LinkedList<LineaConexion> getConexiones() {
        return conexiones;
    }

    public int getTipoDispositivo() {
        return tipoDispositivo;
    }

    public void setTipoDispositivo(int tipoDispositivo) {
        this.tipoDispositivo = tipoDispositivo;
    }

    public boolean isVentanaAbierta() {
        return ventanaAbierta;
    }

    public void setVentanaAbierta(boolean ventanaAbierta) {
        this.ventanaAbierta = ventanaAbierta;
    }
    
    
    public Point getUbicacion() {
        return ubicacion;
    }

    public void setUbicacion(Point ubicacion) {
        this.ubicacion = ubicacion;
    }

    public int getTipoDeConeccion() {
        return tipoDeConeccion;
    }

    public void setTipoDeConeccion(int tipoDeConeccion) {
        this.tipoDeConeccion = tipoDeConeccion;
    }
   
    
        
    private void MousePressed(java.awt.event.MouseEvent evt) throws MACException {
        
       if(this.panelPrincipal.getSeEstaConectando())//se esta conectando?
       {//se esta conectando
            this.panelPrincipal.empiezaDibujar(this.ubicacion,this);           
            this.panelPrincipal.repaint();
            repaint();
       }
       else
       {//No se esta conectando
           if(this.panelPrincipal.getSeEstaEliminando())
           {// se esta eliminando
               
               this.panelPrincipal.eliminarBoton(this);
               this.panelPrincipal.borrarDispositivo(this.getText());
             
               this.panelPrincipal.repaint();
               
           }
           else
           {//click en el boton
               if(evt.getClickCount()==2 && this.ventanaAbierta==false)
               {//se muestra la ventana del dispositivo
                   this.ventanaAbierta=true;
                   this.mostrarVentana(tipoDispositivo);
                   
               }

               if(this.conexiones.size()>0)
               {//Si tiene conexiones

                   repaint();
               }
           }
       }
    }
    
    public void mostrarVentana(int tipo) throws MACException
    {
         GestorGrafo gestorGra= panelPrincipal.getGestorGrafo();
         switch(tipoDispositivo)
         {
             case 1: 
                 Dispositivo disp= gestorGra.getDispositivo(this.getText());
                 tsb.UI.Ventanas.VentanaPC ventanaPC = new tsb.UI.Ventanas.VentanaPC(this.getText(),panelPrincipal.getGestorDispositivos(),disp,this);
                 ventanaPC.setVisible(true);
                 break;
             case 2: 
                 
                     break;
             case 3:
                 break;
             case 4:
                  Dispositivo router= gestorGra.getDispositivo(this.getText());
                //tsb.UI.Ventanas.VantanaRouter ventanaRouter = new tsb.UI.Ventanas.VantanaRouter(this.getText(),panelPrincipal.getGestorDispositivos(),router,this);
                 tsb.UI.Ventanas.VentanaRouter ventanaRouter = new tsb.UI.Ventanas.VentanaRouter(this.getText(),panelPrincipal.getGestorDispositivos(),router,this);
                 ventanaRouter.setVisible(true);
                 break;
             case 5:
                   Dispositivo swittch= gestorGra.getDispositivo(this.getText());
                   tsb.UI.Ventanas.VentanaSwitch ventanaSwitch = new tsb.UI.Ventanas.VentanaSwitch(this.getText(),panelPrincipal.getGestorDispositivos(),swittch,this);
                   ventanaSwitch.setVisible(true);
                 break;
             case 6:
                   Dispositivo server= gestorGra.getDispositivo(this.getText());
                   tsb.UI.Ventanas.VentanaServer ventanaServer = new tsb.UI.Ventanas.VentanaServer(this.getText(),panelPrincipal.getGestorDispositivos(),server,this);
                   ventanaServer.setVisible(true);
                 break;
             case 7:
                   Dispositivo modem= gestorGra.getDispositivo(this.getText());
                   tsb.UI.Ventanas.VentanaModem ventanaModem = new  tsb.UI.Ventanas.VentanaModem(this.getText(),panelPrincipal.getGestorDispositivos(),modem,this);
                   ventanaModem.setVisible(true);
                 break;
         }



        
    }
     
      private void MouseReleased(java.awt.event.MouseEvent evt) {
          
          if(this.panelPrincipal.getSeEstaConectando())//Se esta conectando
          {//Si
              Point p= new Point(evt.getX()+evt.getComponent().getLocation().x,evt.getY()+evt.getComponent().getLocation().y);
              
              BotonPersonalizado b=this.panelPrincipal.hayUnBoton(p);//boton donde termino la conexion
             
              if(b!=null)
              {
                  this.panelPrincipal.terminaDibujar(b);
                  
                  LineaConexion c=this.panelPrincipal.getConexionActual();
                  c.setFin(b.getUbicacion());
                  switch(c.getTipo())
                  {
                      case 1://EthernetRJ45
                         // this.panelPrincipal.getVentanaPrincipal().getPanelArbolo().addConecciones(panelArbolo.RJ45,"RJ45: "+this.getText()+"/"+b.getText());
                           c.setNombreAMostrar("RJ45: "+this.getText()+"/"+b.getText());
                          this.panelPrincipal.getVentanaPrincipal().getPanelArbolo().addConecciones(panelArbolo.RJ45,c.getNombreAMostrar());
                          break;
                      case 2://Fibra Optica
                          c.setNombreAMostrar("Fibra Óptica: "+this.getText()+"/"+b.getText());
                          this.panelPrincipal.getVentanaPrincipal().getPanelArbolo().addConecciones(panelArbolo.FIBRA,c.getNombreAMostrar());
                          break;
                      case 3://Serial DCE
                          c.setNombreAMostrar("Serial DCE: "+this.getText()+"/"+b.getText());
                          this.panelPrincipal.getVentanaPrincipal().getPanelArbolo().addConecciones(panelArbolo.SERIALDCE,c.getNombreAMostrar());
                          break;
                      case 4://Ethernet Rj11
                          c.setNombreAMostrar("RJ45: "+this.getText()+"/"+b.getText());
                         //this.panelPrincipal.getVentanaPrincipal().getPanelArbolo().addConecciones(panelArbolo.SERIALDCE,"RJ45");
                          break;
                      case 5://Wireless
                          c.setNombreAMostrar("Wireless: "+this.getText()+"/"+b.getText());
                          this.panelPrincipal.getVentanaPrincipal().getPanelArbolo().addConecciones(panelArbolo.WIRElESS,c.getNombreAMostrar());
                          break;
                      case 6://Coaxial
                          c.setNombreAMostrar("Coaxial: "+this.getText()+"/"+b.getText());
                          this.panelPrincipal.getVentanaPrincipal().getPanelArbolo().addConecciones(panelArbolo.COAXIAL,c.getNombreAMostrar());
                          break;
                      case 7://Automatica
                          c.setNombreAMostrar("Automatica: "+this.getText()+"/"+b.getText());
                          this.panelPrincipal.getVentanaPrincipal().getPanelArbolo().addConecciones(panelArbolo.AUTOMATICA,c.getNombreAMostrar());
                          break;
                      case 8://SerialDTE
                          c.setNombreAMostrar("Serial DTE: "+this.getText()+"/"+b.getText());
                          this.panelPrincipal.getVentanaPrincipal().getPanelArbolo().addConecciones(panelArbolo.SERIALDTE,c.getNombreAMostrar());
                          break;
                          
                  }
                  
                  b.addConexion(c);
                  this.addConexion(c);
                  this.panelPrincipal.conexionActualNull();
                  this.panelPrincipal.agregarConexionAlGrafo(this.getText(), b.getText(), c.getTipo());
                  
                  panelPrincipal.paintAll(panelPrincipal.getGraphics());
                  
              }
               else
              {
                  this.panelPrincipal.conexionActualNull();
              }
              
              //terminar de conectar
             
              this.panelPrincipal.getVentanaPrincipal().habilitarBotones();
          
          }
          else
          {//NO se esta conectando
              if(this.conexiones.size()>0)
              {//si
                  this.panelPrincipal.terminaDibujar2();
                  
              
              }
              else
              {//N

              }
                  
              //NO borrar esto!!!!!
              //  VentanaPC vpc = new VentanaPC("PC-1");
              //  vpc.setVisible(true);
              
          }

      }
      
       private void MouseDragged(java.awt.event.MouseEvent evt) {
            
            if(this.panelPrincipal.getSeEstaConectando())//se esta conectando?
            {//Si
                this.panelPrincipal.dibuja(new Point(evt.getComponent().getLocation().x+evt.getX(),evt.getComponent().getLocation().y+evt.getY()));
                this.repaint();
             
            }
            else
            {//No
                if(this.conexiones.size()>0)//el dispositivo tiene conecccion
                {//Si
                    //mover dispositivo y dibujar
                    BotonPersonalizado b= (BotonPersonalizado)evt.getComponent();
                    int xAnterior= (int)b.getUbicacion().getX();
                    int yAnterior=  (int)b.getUbicacion().getY();
                    
                    b.setLocation(b.getX()+evt.getX()-32, b.getY()+evt.getY()-32);
                    
                    int x=(int)(this.getUbicacion().getX()+evt.getX()-32);
                    int y=(int)(this.getUbicacion().getY()+evt.getY()-32);
                    
                    this.setUbicacion(new Point(x,y));
                    
                    
                    Iterator iter= this.conexiones.iterator();
                    while(iter.hasNext())
                    {
                        LineaConexion c= (LineaConexion)iter.next();
                        
                        if(xAnterior==c.getIni().getX() && yAnterior==c.getIni().getY())
                        {//el boton es el inicio
                            c.setIni(this.ubicacion);
                        }
                        else
                        {
                            c.setFin(this.ubicacion);
                        }
                    }
                    
                    this.panelPrincipal.dibuja2(new Point(evt.getComponent().getLocation().x+evt.getX(),evt.getComponent().getLocation().y+evt.getY()), this.getUbicacion());

                    this.repaint();
                }
                else
                {//no
                    //mover dispositivo
                    javax.swing.JButton b= (javax.swing.JButton)evt.getComponent();
                    b.setLocation(b.getX()+evt.getX()-50, b.getY()+evt.getY()-50);
                    
                    this.setUbicacion(new Point(evt.getComponent().getLocation().x+evt.getX(),evt.getComponent().getLocation().y+evt.getY()));
                }
            }

       }
       
//      
     private Point centroDeBoton(Component c)
     {
         
         int altoBoton =(int) c.getSize().getHeight();
         int anchoBoton =(int) c.getSize().getWidth();
         int x = c.getLocation().x+anchoBoton/2;
         int y= c.getLocation().y+altoBoton/2;
         return new Point(x,y);
     }

}
